Double Quantum Dots#

Now we have what it takes to understand multi-dot quantum devices. We’ll start by taking an extended look at a double-dot system, with two quantum dots aranged in series with source and drain baths on either side.

Classical Model#

To start, we can consider a classical model of the double-dot system. In the Van Der Wiel paper they present a classical model of a double quantum dot system shown in figure 1. This model turns out to be quite accurate in demonstrating the key features of this system.

../../_images/VDW-fig1.png

Fig. 5 A classical model of a double quantum dot presented in the Van Der Wiel paper. The dots are coupled to sources, drains, and each other through a resistor and capacitor in parallel. Each dot is also coupled to a “plunger” that can manipulate the chemical potential of that dot.#

Obviously, this model simplifies things a lot, and is not entirely realistic to the devices that HRL uses (see comparison), but is still a great way to discuss some of the tools used to understand the operation of these devices.

In the Van Der Wiel paper, they develop analytical expressions for the chemical potential \(\mu\) of each dot in terms of the current electron populations, the gate voltages, and the cross capacitances. These equations are (1) and (2), respectively.

(1)#\[\mu_1 = \left(N_2-\frac{1}{2}\right)E_{C2} + N_1E_{Cm} - \frac{1}{|e|}\left(C_{g1}V_{g1}E_{Cm} + C_{g2}V_{g2}E_{Cm}\right)\]
(2)#\[\mu_2 = \left(N_2-\frac{1}{2}\right)E_{C2} + N_1E_{Cm} - \frac{1}{|e|}\left(C_{g1}V_{g1}E_{Cm} + C_{g2}V_{g2}E_{Cm}\right)\]

The energy \(E_{C1}\) is the increase in the potential energy of dot 1 when an electron tunnels into it. Likewise, \(E_{C2}\) is the increase in the energy of dot 2 when an electron tunnels into it. Lastly, \(E_{Cm}\) is the increase in the energy of one dot when an electron tunnels into the other dot. By defining the chemical potential of the source and drain to be \(\mu=0\), we can understand the behavior of the double dot system using equations (1) and (2). Whenever \(\mu_1 < -E_{C1}\), an electron can (and will) tunnel into dot 1 from the source, while whenever \(\mu_2 < -E_{C2}\), an electron will tunnel into dot 2 from the drain. This will continue until \(0<\mu_1<-E_{C1}\) and \(0 < \mu_2 < E_{C2}\), when neither dot can accept any more electrons. Of course, the only control we have here are the gate voltages for either dot: \(V_{g1}\) and \(V_{g2}\). By modulating these controls, we can affect the stable configuration of electrons the double dot system.

Stability Diagrams#

Stability diagrams are the method used to understand the mapping between \(V_{g1}\), \(V_{g2}\), and the stable configuration of \(N_1\) and \(N_2\). These diagrams follow directly from the discussion of charge sensing in the previous section. The figure from the Dodson paper on that page shows how we can infer dot population from the number of spikes on a plot of \(dI/dV\), where \(I\) is the current through the dot sensor and \(V\) is the voltage of the plunger. When an electron tunnels into the dot, there is an immediate change in the potential of the sensor dot which causes an immediate change to the current \(I\) and appears as a sharp peak in the plot of \(dI/dV\) vs \(V\).

Stability diagrams are effectively 2D renderings of the same \(dI/dV\) plot, where we are modulating both \(V_{g1}\) and \(V_{g2}\) and plotting \(dI/dV\) on a heat map. Below is an example experimental stability diagram from Borselli et al

../../_images/Borselli-fig4.png

Fig. 6 Stability diagram from figure 4 of Borselli et al.#

The annotations in the above figure correspond to the stable electron configurations when gate voltages are anywhere within the indicated regions bounded by the bright lines.

Alternative Understanding of Stability Diagrams

Another way of thinking about charge stability diagrams is by reconceptualizing the spikes in the Dodson figure on the previous page as the plunger voltage at which you have a 50/50 chance of having an additional electron in the dot. In this way, we can think of the lines that separate two distinct electron configurations on the stability diagrams as paths in voltage space along which either electron configuration is equally likely.

So for instance, the bright line separating the \((1,1)\) and \((1,0)\) configurations is a set of voltages where we know we have one electron in dot 1, and a 50% change of having an electron in dot 2.

Interactive Stability Diagrams#

Using (1) and (2) we can mathematically simulate stability diagrams for the Van Der Wiel double-dot model, which will allow us to better understand the contributing factors to why these diagrams have the shape that they do.

Warning

None of the interactive plots here will have any sort of realistic parameters, their sole purpose is for you to get a feel for how changing parameters in the device change the resulting stability diagrams.

Hide code cell source
import numpy as np

from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, CustomJS, Slider, MultiLine
from bokeh.plotting import figure, show
from bokeh.io import output_file
from bokeh.resources import CDN
from bokeh.embed import file_html
import IPython

ECHARGE = 1
CG1 = 1
CG2 = 1
CL = 1
CR = 1

CM = 1

C1 = CG1 + CL + CM
C2 = CG2 + CR + CM
EC1 = ECHARGE * ECHARGE / C1 / (1 - CM * CM / C1 / C2)
EC2 = ECHARGE * ECHARGE / C2 / (1 - CM * CM / C2 / C1)
ECM = ECHARGE * ECHARGE / CM / (C1 * C2 / CM / CM - 1)

XLIM = 4
YLIM = 4

v1t1 = []
v2t1 = []
v1t2 = []
v2t2 = []
hexx = []
hexy = []
x1start = ECHARGE * (EC2 / 2 + 0 * ECM - EC1 * EC2 / ECM * (0 + .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
y1start = ECHARGE * (EC1 / 2 + 0 * ECM - EC2 * EC1 / ECM * (0 + .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
x2start = ECHARGE * (-EC2 / 2 + 1 * ECM - EC1 * EC2 / ECM * (1 - .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
y2start = ECHARGE * (-EC1 / 2 + 1 * ECM - EC2 * EC1 / ECM * (1 - .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
deltax = (ECM * ECM - EC1 * EC2) / (ECM * CG1 * ECM - CG1 * EC1 * EC2)
deltay = (ECM * ECM - EC1 * EC2) / (ECM * CG2 * ECM - CG2 * EC1 * EC2)
y1start_save = y1start
y2start_save = y2start
while x1start < XLIM + deltax:
    while y1start < YLIM + deltay:
        v1t1.append(x1start)
        v2t1.append(y1start)
        v1t2.append(x2start)
        v2t2.append(y2start)
        hexx.append( [x1start, x2start, x1start, x2start-deltax, x1start-deltax, x2start-deltax, x1start] )
        hexy.append( [y1start, y2start-deltay, y1start-deltay, y2start-deltay, y1start, y2start, y1start] )
        y1start += deltay
        y2start += deltay
    x1start += deltax
    x2start += deltax
    y1start = y1start_save
    y2start = y2start_save

source = ColumnDataSource(data=dict(v1t1=v1t1, v2t1=v2t1, v1t2=v1t2, v2t2=v2t2, hexx=hexx, hexy=hexy))

plot = figure(y_range=(0, YLIM), x_range=(0, XLIM), width=400, height=400,
              x_axis_label=r"$$V_1\text{ (arbitrary units)}$$",
              y_axis_label=r"$$V_2\text{ (arbitrary units)}$$")

hexagons = MultiLine(xs='hexx', ys='hexy', line_color="black")
plot.add_glyph(source, hexagons)
plot.circle(x='v1t1', y='v2t1', color="blue", source=source)
plot.circle(x='v1t2', y='v2t2', color="red", source=source)

cg1_slider = Slider(start=0.4, end=2, value=1, step=.02, title=r"$$C_{g1}$$")
cg2_slider = Slider(start=0.4, end=2, value=1, step=.02, title=r"$$C_{g2}$$")

callback = CustomJS(args=dict(source=source, ECHARGE=ECHARGE, cg1=cg1_slider, cg2=cg2_slider,
                              cl=1, cr=1, cm=1, XLIM=XLIM, YLIM=YLIM),
                    code="""
    const CM = cm
    const CG1 = cg1.value
    const CG2 = cg2.value
    const CR = cr
    const CL = cl

    const C1 = CG1 + CL + CM
    const C2 = CG2 + CR + CM
    const EC1 = ECHARGE * ECHARGE / C1 / (1 - CM * CM / C1 / C2)
    const EC2 = ECHARGE * ECHARGE / C2 / (1 - CM * CM / C2 / C1)
    const ECM = ECHARGE * ECHARGE / CM / (C1 * C2 / CM / CM - 1)

    const v1t1 = []
    const v2t1 = []
    const v1t2 = []
    const v2t2 = []
    const hexx = []
    const hexy = []
    var x1start = ECHARGE * (EC2 / 2 + 0 * ECM - EC1 * EC2 / ECM * (0 + .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
    var y1start = ECHARGE * (EC1 / 2 + 0 * ECM - EC2 * EC1 / ECM * (0 + .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
    var x2start = ECHARGE * (-EC2 / 2 + 1 * ECM - EC1 * EC2 / ECM * (1 - .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
    var y2start = ECHARGE * (-EC1 / 2 + 1 * ECM - EC2 * EC1 / ECM * (1 - .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
    const deltax = (ECM * ECM - EC1 * EC2) / (ECM * CG1 * ECM - CG1 * EC1 * EC2)
    const deltay = (ECM * ECM - EC1 * EC2) / (ECM * CG2 * ECM - CG2 * EC1 * EC2)
    const y1start_save = y1start
    const y2start_save = y2start
    while (x1start < XLIM + deltax) {
        while (y1start < YLIM + deltay) {
            v1t1.push(x1start)
            v2t1.push(y1start)
            v1t2.push(x2start)
            v2t2.push(y2start)
            hexx.push( [x1start, x2start, x1start, x2start-deltax, x1start-deltax, x2start-deltax, x1start] )
            hexy.push( [y1start, y2start-deltay, y1start-deltay, y2start-deltay, y1start, y2start, y1start] )
            y1start += deltay
            y2start += deltay
        }
        x1start += deltax
        x2start += deltax
        y1start = y1start_save
        y2start = y2start_save
    }

    source.data = { v1t1, v2t1, v1t2, v2t2, hexx, hexy }
""")

cg1_slider.js_on_change('value', callback)
cg2_slider.js_on_change('value', callback)

html_repr = file_html(row(plot, column(cg1_slider, cg2_slider)), CDN)
IPython.display.HTML(html_repr)
Bokeh Application

Play around with the simulation above. Looking back to the Van Der Wiel model, notice that the sliders here are adjusting the capacitances between the gate voltages \(V_{g1}\) and \(V_{g2}\) and the dots.

Check out a similar simulation below with more parameters to play with.

Hide code cell source
import numpy as np

from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, CustomJS, Slider, MultiLine
from bokeh.plotting import figure, show
from bokeh.io import output_file
from bokeh.resources import CDN
from bokeh.embed import file_html
import IPython

ECHARGE = 1
CG1 = 1
CG2 = 1
CL = 1
CR = 1

CM = 1

C1 = CG1 + CL + CM
C2 = CG2 + CR + CM
EC1 = ECHARGE * ECHARGE / C1 / (1 - CM * CM / C1 / C2)
EC2 = ECHARGE * ECHARGE / C2 / (1 - CM * CM / C2 / C1)
ECM = ECHARGE * ECHARGE / CM / (C1 * C2 / CM / CM - 1)

XLIM = 4
YLIM = 4

v1t1 = []
v2t1 = []
v1t2 = []
v2t2 = []
hexx = []
hexy = []
x1start = ECHARGE * (EC2 / 2 + 0 * ECM - EC1 * EC2 / ECM * (0 + .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
y1start = ECHARGE * (EC1 / 2 + 0 * ECM - EC2 * EC1 / ECM * (0 + .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
x2start = ECHARGE * (-EC2 / 2 + 1 * ECM - EC1 * EC2 / ECM * (1 - .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
y2start = ECHARGE * (-EC1 / 2 + 1 * ECM - EC2 * EC1 / ECM * (1 - .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
deltax = (ECM * ECM - EC1 * EC2) / (ECM * CG1 * ECM - CG1 * EC1 * EC2)
deltay = (ECM * ECM - EC1 * EC2) / (ECM * CG2 * ECM - CG2 * EC1 * EC2)
y1start_save = y1start
y2start_save = y2start
while x1start < XLIM + deltax:
    while y1start < YLIM + deltay:
        v1t1.append(x1start)
        v2t1.append(y1start)
        v1t2.append(x2start)
        v2t2.append(y2start)
        hexx.append( [x1start, x2start, x1start, x2start-deltax, x1start-deltax, x2start-deltax, x1start] )
        hexy.append( [y1start, y2start-deltay, y1start-deltay, y2start-deltay, y1start, y2start, y1start] )
        y1start += deltay
        y2start += deltay
    x1start += deltax
    x2start += deltax
    y1start = y1start_save
    y2start = y2start_save

source = ColumnDataSource(data=dict(v1t1=v1t1, v2t1=v2t1, v1t2=v1t2, v2t2=v2t2, hexx=hexx, hexy=hexy))

plot = figure(y_range=(0, YLIM), x_range=(0, XLIM), width=400, height=400,
              x_axis_label=r"$$V_1\text{ (arbitrary units)}$$",
              y_axis_label=r"$$V_2\text{ (arbitrary units)}$$")

hexagons = MultiLine(xs='hexx', ys='hexy', line_color="black")
plot.add_glyph(source, hexagons)
plot.circle(x='v1t1', y='v2t1', color="blue", source=source)
plot.circle(x='v1t2', y='v2t2', color="red", source=source)

cm_slider = Slider(start=0.02, end=10, value=1, step=.02, title=r"$$C_M$$")
cg1_slider = Slider(start=0.4, end=2, value=1, step=.02, title=r"$$C_{g1}$$")
cg2_slider = Slider(start=0.4, end=2, value=1, step=.02, title=r"$$C_{g2}$$")
cl_slider = Slider(start=0.02, end=10, value=1, step=.02, title=r"$$C_L$$")
cr_slider = Slider(start=0.02, end=10, value=1, step=.02, title=r"$$C_R$$")

callback = CustomJS(args=dict(source=source, ECHARGE=ECHARGE, cg1=cg1_slider, cg2=cg2_slider,
                              cl=cl_slider, cr=cr_slider, cm=cm_slider, XLIM=XLIM, YLIM=YLIM),
                    code="""
    const CM = cm.value
    const CG1 = cg1.value
    const CG2 = cg2.value
    const CR = cr.value
    const CL = cl.value

    const C1 = CG1 + CL + CM
    const C2 = CG2 + CR + CM
    const EC1 = ECHARGE * ECHARGE / C1 / (1 - CM * CM / C1 / C2)
    const EC2 = ECHARGE * ECHARGE / C2 / (1 - CM * CM / C2 / C1)
    const ECM = ECHARGE * ECHARGE / CM / (C1 * C2 / CM / CM - 1)

    const v1t1 = []
    const v2t1 = []
    const v1t2 = []
    const v2t2 = []
    const hexx = []
    const hexy = []
    var x1start = ECHARGE * (EC2 / 2 + 0 * ECM - EC1 * EC2 / ECM * (0 + .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
    var y1start = ECHARGE * (EC1 / 2 + 0 * ECM - EC2 * EC1 / ECM * (0 + .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
    var x2start = ECHARGE * (-EC2 / 2 + 1 * ECM - EC1 * EC2 / ECM * (1 - .5)) / (CG1 * ECM - CG1 * EC1 * EC2 / ECM)
    var y2start = ECHARGE * (-EC1 / 2 + 1 * ECM - EC2 * EC1 / ECM * (1 - .5)) / (CG2 * ECM - CG2 * EC2 * EC1 / ECM)
    const deltax = (ECM * ECM - EC1 * EC2) / (ECM * CG1 * ECM - CG1 * EC1 * EC2)
    const deltay = (ECM * ECM - EC1 * EC2) / (ECM * CG2 * ECM - CG2 * EC1 * EC2)
    const y1start_save = y1start
    const y2start_save = y2start
    while (x1start < XLIM + deltax) {
        while (y1start < YLIM + deltay) {
            v1t1.push(x1start)
            v2t1.push(y1start)
            v1t2.push(x2start)
            v2t2.push(y2start)
            hexx.push( [x1start, x2start, x1start, x2start-deltax, x1start-deltax, x2start-deltax, x1start] )
            hexy.push( [y1start, y2start-deltay, y1start-deltay, y2start-deltay, y1start, y2start, y1start] )
            y1start += deltay
            y2start += deltay
        }
        x1start += deltax
        x2start += deltax
        y1start = y1start_save
        y2start = y2start_save
    }

    source.data = { v1t1, v2t1, v1t2, v2t2, hexx, hexy }
""")

cm_slider.js_on_change('value', callback)
cg1_slider.js_on_change('value', callback)
cg2_slider.js_on_change('value', callback)
cl_slider.js_on_change('value', callback)
cr_slider.js_on_change('value', callback)

html_repr = file_html(row(plot, column(cm_slider, cg1_slider, cg2_slider, cl_slider, cr_slider)), CDN)
IPython.display.HTML(html_repr)
Bokeh Application

Guiding Questions#

What happens when \(\; C_m >> C_{L}, C_{R}\)?

In this limit, the distinction between the dots begins to blur. With strongly coupled dots, any change to \(V_{g1}\) the total “lever arm” between plunger one (\(V_{g1}\)) and dot one is effectively the same as that between plunger one and dot two. The same goes for the “lever arm” between plunger two (\(V_{g2}\)) and the dots.

In the limit, it becomes almost meaningless to consider the dots as separate entities, an electron in one dot is effectively spread out across both of the dots. What you really have is a single large quantum dot attached to two plungers.

../../_images/VDW-fig2c.png

Fig. 8 This diagram is from figure 2c of the Van Der Wiel paper. Notice the dashed lines between configurations like \((2,0)\), \((1,1)\), and \((0,2)\), underscoring that these configurations for all intents and purposes are indistinguishable in this limit.#

What happens as \(\; C_m\rightarrow 0\)?

In this limit, effectively act as individual dots that are not coupled to each other in any way. The lack of diagonal lines on the stability diagram indicates that \(V_{g1}\) and \(V_{g2}\) are affecting only dot 1 and 2 (respectively), and there is no cross capacitance at all between the dots.

../../_images/VDW-fig2a.png

Fig. 9 This diagram is from figure 2a of the Van Der Wiel paper.#

Comparing HRL’s Devices to the Van Der Wiel Model#

Obviously the Van Der Wiel model is incredibly simplistic, but it does a pretty good job demonstrating key features of placing quantum dots in series with one another. There is however, one huge difference between HRL’s devices (as well as similar devices like the one described in Borselli et al): HRL’s devices do not use resistors between dots. Instead, electrons trying to pass from one dot to the next must overcome a potential barrier introduced by a separate “gate” electrode which can also be modulated. See the next page on multi-dot arrays for further discussion of HRL-specific quantum dot arrays and device operation.

../../_images/HA-fig1.png

Fig. 10 Diagram of the SLEDGE device from figure 1 in the Ha Ha paper. This diagram is perhaps a bit overly complicated for the point being made, but the key thing to notice is that there are not microscopic resistors separating the dots (labeled “P” in panel B), but rather smaller dots (labeled “X” in panel B), whose potentials can be raised/lowered to mediate the transport of electrons between dots. See the paper for more information about this diagram.#

Quantum Effects#

We are now in a position to discuss some of the oddities of experimental stability diagrams, much of which arise from the quantum nature of the structure that we are dealing with. In particular, the confinement of electrons into quantum dots means that there is a discrete energy spectrum which is available to the electrons, and so an electron cannot just jump into a dot whenever it has enough energy to do so. In order for an electron to hop into the dot, it must both have enough energy and there must be an available energy level in the dot that the electron can access.

Fortunately, the effect of the discrete energy spectrum is relatively minimal on the overall stability diagram, mostly appearing in a smoothing out of the stability lines near triple points.

There is another effect that is quantum but has more to do with the implementation. As mentioned above these devices do not actually contain any resistors, instead modulating electron travel with potential barriers. Because of this, as we continue adding higher energy electrons, the electrons we add are less and less confined to staying within their dot. This effect is apparent in the figure presented by Borselli et al as well as the figure below where the lines in the top right of the plots begin to smooth out, as though there were a high mutual capacitance between the dots. In effect that is what it means for the electrons to be less confined: that they have a greater effect on the components around them.

Lastly, you should note that in both the figure from Borselli et al as well as below, the diagonal lines connecting triple points appear to be non-existent. This is not actually a physical effect so much as a consequence of how the plots were made. In constructing these plots, they swept the mutual voltage \(V_1+V_2\) which effectively scans across this diagram diagonally, which fails to capture the changes in sensor dot current that occur between configurations \((n,m)\) and \((n+1,m+1)\), since they occur on diagonals.

../../_images/HA-fig4-0.png

Fig. 11 Experimental stability diagram from figure 4 in the Ha Ha paper. Notice the smoothing out of the lines - the areas enclosed are no longer perfect hexagons. Also, notice how the diagonal lines between the \((n,m)\) area and the \((n+1,m+1)\) area are almost non-existent.#

Cross Capacitances#

There is however, a large physical inaccuracy in the Van Der Weil model: each components is only modeled as being capacitively coupled to adjacent components. In reality, every electrode on the device will have some capacitance between itself and every other part of the device. In the schematic shown in figure 1, we might imagine adding capacitors between \(V_{g2}\) and \(N_2\); \(V_{g1}\) and \(N_1\); \(S\) and \(N_2\); and \(N_1\) and \(D\). The notion of every electrical component having some capacitance with every other electrical component is what is referred to by cross capacitance. You can imagine how complicated these cross capacitances get when dealing with the number of electrodes shown in figure 4.

To demonstrate the effect of these cross capacitances, we have visualized some of the effects in an animation below. We show a device much like the one in figure 4 but with only a two dots (\(P0\) and \(P1\)), mediated from the source and the drain by three gates (\(X0\), \(X1\), and \(X2\)). We then plot on the \(z\)-axis the electric potential at every point in the semiconductor layer where electrons live and traverse the device. Then, we show the effects as we wiggle some of the gate voltages. This is not a quantitative plot, but rather a qualitative demonstration of how small changes in any one of the gate voltages really do affect the potential at every single point in the device.

Hide code cell source
from IPython.display import Video
Video("./gatepot.mp4", embed=True, width=800)